home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / SOCKCMD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-01  |  3.9 KB  |  180 lines

  1. /* Socket status display code
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include "commands.h"
  6. #ifdef MSDOS
  7. #include "hardware.h"
  8. #else
  9. #include "mbuf.h"
  10. #include "proc.h"
  11. #endif
  12. #include "lzw.h"
  13.  
  14. #if !defined(_lint)
  15. static char rcsid[] OPTIONAL = "$Id: sockcmd.c,v 1.16 1997/06/01 22:10:46 root Exp root $";
  16. #endif
  17.  
  18. /* Socket status display command */
  19. int
  20. dosock (argc, argv, p)
  21. int argc;
  22. char *argv[];
  23. void *p OPTIONAL;
  24. {
  25. register struct usock *up;
  26. int s,i;
  27. struct sockaddr fsock;
  28. char const *cp;
  29.  
  30.     if (argc < 2)    {
  31.         tputs ("S#  Type    PCB       Remote socket        Owner\n");
  32.         for (s = SOCKBASE; s < Nusock + SOCKBASE; s++)    {
  33.             up = itop (s);
  34.             if (up == NULLUSOCK)
  35.                 continue;
  36.  
  37.             i = sizeof (fsock);
  38.             if (getpeername (s, (char *)&fsock, &i) == 0 && i != 0)
  39.                 cp = psocket (&fsock);
  40.             else
  41.                 cp = "";
  42.  
  43.             tprintf ("%3d %-8s%-8.8lx %-22s%-8.8lx %-10s\n",
  44.                 s, Socktypes[(int)up->type], (uint32) up->cb.p,
  45.                 cp, (uint32) up->owner, up->owner->name);
  46.         }
  47.         return 0;
  48.     }
  49.     s = atoi (argv[1]);
  50.     if (s < SOCKBASE || s >= Nusock + SOCKBASE)    {
  51.         tputs ("Number out of range\n");
  52.         return 1;
  53.     }
  54.     up = itop (s);
  55.     if (up == NULLUSOCK){
  56.         tputs ("Socket not in use\n");
  57.         return 0;
  58.     }
  59.     tprintf ("%s %8.8lx %s", 
  60.         Socktypes[(int)up->type], (uint32) up->cb.p,
  61.         (up->flag == SOCK_ASCII) ? "ascii" : "binary");
  62.     if (up->eol[0] != '\0')    {
  63.         tputs (" eol seq:");
  64.         for (i = 0; i < (int)sizeof(up->eol) && up->eol[i] != '\0'; i++)
  65.             tprintf (" %02x", up->eol[i]);
  66.     }
  67.     tprintf ("  Since: %s", ctime (&up->created));
  68.     if (up->cb.p == NULL)
  69.         return 0;
  70.     switch (up->type)    {
  71.         case TYPE_RAW:
  72.         case TYPE_LOCAL_DGRAM:
  73.             tprintf ("Inqlen: %d packets\n", socklen (s, 0));
  74.             tprintf ("Outqlen: %d packets\n", socklen (s, 1));
  75.             break;
  76.         case TYPE_LOCAL_STREAM:
  77.             tprintf ("Inqlen: %d bytes\n", socklen (s, 0));
  78.             tprintf ("Outqlen: %d bytes\n", socklen (s, 1));
  79.             break;
  80.         case TYPE_TCP:
  81.             st_tcp (up->cb.tcb);
  82.             break;
  83.         case TYPE_UDP:
  84.             (void) st_udp (up->cb.udp, 0);
  85.             break;
  86. #ifdef    AX25
  87.         case TYPE_AX25I:
  88.             st_ax25 (up->cb.ax25);
  89.             break;
  90. #endif
  91. #ifdef    NETROM
  92.         case TYPE_NETROML4:
  93.             donrdump (up->cb.nr4);
  94.             break;
  95. #endif
  96.         default:
  97.             break;
  98.     }
  99. #ifdef LZW
  100.     if (up->zout != NULLLZW)
  101.         tprintf ("Compressed %ld bytes. (%s mode - %d/%-d)\n",up->zout->cnt, up->zout->mode ? "fast" : "compact", up->zout->codebits, up->zout->maxbits);
  102.     if (up->zin != NULLLZW)
  103.         tprintf ("Decompressed %ld bytes. (%s mode - %d/%-d)\n",up->zin->cnt, up->zin->mode ? "fast" : "compact", up->zin->codebits, up->zin->maxbits);
  104. #endif
  105.     return 0;
  106. }
  107.  
  108.  
  109. /* Kick the session related to a particular socket
  110.  * this is easier then the tcp kick, ax25 kick, etc... commands
  111.  * 920117 - WG7J
  112.  */
  113. int
  114. dokicksocket(argc,argv,p)
  115. int argc OPTIONAL;
  116. char *argv[];
  117. void *p OPTIONAL;
  118. {
  119. register struct usock *up;
  120. int s;                /*socket to kick*/
  121. int retval = 0;
  122.  
  123.     s = atoi (argv[1]);
  124.     if (s < SOCKBASE || s >= Nusock + SOCKBASE)    {
  125.         tputs ("Number out of range\n");
  126.         return 1;
  127.     }
  128.     up = itop (s);
  129.     if (up == NULLUSOCK) {
  130.         tputs ("Socket not in use\n");
  131.         return 0;
  132.     }
  133.     if(up->type == TYPE_TCP)
  134.         retval = kick_tcp (up->cb.tcb);
  135. #ifdef AX25
  136.     if(up->type == TYPE_AX25I)
  137.         retval = kick_ax25 (up->cb.ax25);
  138. #endif
  139. #ifdef NETROM
  140.     if(up->type == TYPE_NETROML4)
  141.         retval = kick_nr4 (up->cb.nr4);
  142. #endif
  143.     if(retval == -1)
  144.         tputs ("Kick not successfull\n");
  145.     return 0;
  146. }
  147.  
  148.  
  149. /* Reset (kill) the specified
  150.  */
  151.  
  152. int
  153. doresetsocket(argc,argv,p)
  154. int argc OPTIONAL;
  155. char *argv[];
  156. void *p OPTIONAL;
  157. {
  158. register struct usock *up;
  159. int s;                /*socket to kick*/
  160.  
  161.     s = atoi (argv[1]);
  162.     if (s < SOCKBASE || s >= Nusock + SOCKBASE)    {
  163.         tputs ("Number out of range\n");
  164.         return 1;
  165.     }
  166.     up = itop (s);
  167.     if (up == NULLUSOCK) {
  168.         tputs ("Socket not in use\n");
  169.         return 0;
  170.     }
  171.     if(up->cb.p == NULLCHAR)
  172.         close_s (s);
  173.     else
  174.         (void) shutdown (s, 2);
  175.     return 0;
  176. }
  177.  
  178.  
  179.  
  180.